/*
 * SecIndex.h
 *
 *  Created on: 02/11/2009
 *      Author: ngonzalez
 */

#ifndef SECINDEX_H_
#define SECINDEX_H_

#include "../Strategies/Storage/StorageStrategy.h"
#include "../Strategies/Index/IndexStrategy.h"
#include <iostream>
#include <string>
using namespace std;

class SecIndex: public IndexStrategy {


	public: enum indexType {BSharp , Hash, SecuencialIndex };

	public:SecIndex();

	virtual ~SecIndex();

	public: StorageStrategy *storageStrategy;

	public: void SetStorageStrategy(StorageStrategy *storage);

	public: StorageStrategy * GetStorageStrategy() const;

	public: virtual void saludar();

	/**
	 * Verifica la unicidad de la clave a insertar en el indice
	 */
	public: virtual bool checkUniqueness(Clave *clave, Dato *dato);

	/**
	 * Luego de una insercion/modificacion en disco, actualiza el indice con la referencia al
	 * archivo (Numero de bloque,registro o linea en caso de los archivo de texto)
	 */
	public: virtual void updateIndex(int fileReference,Clave *clave, Dato *dato);

	/**
	 * Metodo que, apartir de una clave, me devuelve la posicion en la que se
	 * encuentra el dato correspondiente a esa clave, en la estructura que se esta
	 * usando (Archivo o Buffer)
	 * En caso de no encontrarla, devuelve un valor negativo.
	 */
	public: virtual int getStorageReferenceByKey(Clave *clave);

	/**
	 * Metodo que que borra la clave del indice actualizandolo.Devuelve un numero negativo en caso de error.
	 */
	public: virtual int deleteKey(Clave *clave);

	/**
	 * Workaround agregado, dado que las distintas estrategias de indexado comparten una misma interfaz, y su comportamiento no se el mismo
	 * Problema de Arquitectura.
	 */
	public: virtual int getClassName();

	public: virtual Almacenamiento * getStorage() const;

	public: virtual void setStorage(Almacenamiento *storage);


};

#endif /* SECINDEX_H_ */
